package cn.itcast.web.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

@Component
public class OssUtils {

    /**
     * Region信息，就是你选择的地步分布，如：上海、杭州
     */
    private String endpoint = "";

    /**
     * 密钥ID
     */
    private String accessKeyId = "";

    /**
     * 加密钥匙
     */
    private String accessKeySecret = "";

    /**
     * 存储桶
     */
    private String bucketName = "";

    private String fristKey = "";

    /**
     * 创建存储桶
     */
    public void createBucket() {
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 创建存储空间。
            ossClient.createBucket(bucketName);
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传本地文件至OSS
     *
     * @param filePath 文件路径
     * @param key      唯一key（在oss中的文件名字）
     */
    public void upload(String filePath, String key) {
        this.fristKey = key;
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 上传内容到指定的存储空间（bucketName）并保存为指定的文件名称（key）。
            // String content = "Hello OSS";
            // ossClient.putObject(bucketName, key, new ByteArrayInputStream(content.getBytes()));
            ossClient.putObject(bucketName, key, new FileInputStream(new File(filePath)));
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传文件，以IO流方式
     *
     * @param inputStream 输入流
     * @param key         唯一key（在oss中的文件名字）
     */
    public void upload(InputStream inputStream, String key) {
        try {
            this.fristKey = key;
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 上传内容到指定的存储空间（bucketName）并保存为指定的文件名称（key）。
            // String content = "Hello OSS";
            // ossClient.putObject(bucketName, key, new ByteArrayInputStream(content.getBytes()));
            ossClient.putObject(bucketName, key, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传本地文件至OSS
     *
     * @param file 文件
     * @param key  唯一key（在oss中的文件名字）
     */
    public void upload(File file, String key) {
        try {
            this.fristKey = key;
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 上传内容到指定的存储空间（bucketName）并保存为指定的文件名称（key）。
            // String content = "Hello OSS";
            // ossClient.putObject(bucketName, key, new ByteArrayInputStream(content.getBytes()));
            ossClient.putObject(bucketName, key, new FileInputStream(file));
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传网络文件至OSS
     * @param url 文件url，如：http://www.baidu.com/xxx.jpg
     * @param key 唯一key（在oss中的文件名字）
     */
    public void uploadNetwork(String url, String key) {
        try {
            this.fristKey = key;
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 上传网络流。
            InputStream inputStream = new URL(url).openStream();
            ossClient.putObject(bucketName, key, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除OSS中的文件
     *
     * @param key 唯一key（在oss中的文件名字）
     */
    public void delete(String key) {
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 删除文件。
            ossClient.deleteObject(bucketName, key);
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getUrl() {
        OSSClient client = new OSSClient(endpoint,accessKeyId,accessKeySecret);
        Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
        return client.generatePresignedUrl("sess-hsd", this.fristKey,expiration).toString();
    }

}